package br.com.werp.regras.documento.controle;

import java.util.Iterator;
import java.util.List;

import br.com.werp.regras.documento.integracao.DocumentoDAO;
import br.com.werp.regras.documento.integracao.FabricaDAO;
import br.com.werp.regras.documento.integracao.PagamentoDAO;
import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.documento.DocumentoPagamentoAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoPagamentoVO;
import br.com.werp.regras.geral.vos.tabelas.Agrupamento_documento;
import br.com.werp.regras.geral.vos.tabelas.Documento;
import br.com.werp.regras.geral.vos.tabelas.Documento_pagamento;


/**
 * @author Sobreira
 * Criado em 08/08/2006
 */
public class ControlePagamento {
    public void salvarDocumentoPagamentoAgrupadoDocFinanceiro(Object key,
        String usuario, DocumentoFinanceiroVO documentoFinanceiroVO,
        DocumentoPagamentoVO documentoPagamentoVO) throws Exception {
        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        PagamentoDAO pagamentoDAO = FabricaDAO.getPagamentoDAO();
        ControleDocumento controleDocumento = new ControleDocumento();
        Documento documento = new Documento();
        documento.setDocm_pessoa(documentoFinanceiroVO.getDocm_pessoa());

        controleDocumento.salvarDocumento(key, usuario, documento);

        Documento_pagamento documento_pagamento = new Documento_pagamento();
        BeanUtil.copiarVO(documentoPagamentoVO, documento_pagamento);
        documento_pagamento.setDcpg_id(documento.getDocm_id());
        pagamentoDAO.inserirPagamento(key, documento_pagamento);
        auditoria.auditarRecurso(key, usuario, documento_pagamento,
            Auditoria.INCLUIR);

        Agrupamento_documento agrupamento_documento =
            new Agrupamento_documento();
        agrupamento_documento.setApdo_doc_agrupador(documentoFinanceiroVO.getDocm_id());
        agrupamento_documento.setApdo_doc_agrupado(documento.getDocm_id());
        pagamentoDAO.inserirVOGenericoIdentity(key, agrupamento_documento,
            "apdo_id");
        auditoria.auditarRecurso(key, usuario, agrupamento_documento,
            Auditoria.INCLUIR);
        BeanUtil.copiarVO(documento, documentoPagamentoVO);
        BeanUtil.copiarVO(documento_pagamento, documentoPagamentoVO);
    }


    public List obterPagamentos(int docm_id) throws Exception {
        DocumentoPagamentoAgrupadoVO documentoPagamentoAgrupadoVO =
            new DocumentoPagamentoAgrupadoVO();
        documentoPagamentoAgrupadoVO.setApdo_doc_agrupador(docm_id);

        PagamentoDAO pagamentoDAO = FabricaDAO.getPagamentoDAO();

        return pagamentoDAO.pesquisaPagamentosAgrupados(null,
            documentoPagamentoAgrupadoVO);
    }

    public void apagarDocumentoPagamento(int docm_id, String usuario)
        throws Exception {
        PagamentoDAO pagamentoDAO = FabricaDAO.getPagamentoDAO();
        DocumentoDAO documentoDAO = FabricaDAO.getDocumentoDAO();
        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        List pagamentos = obterPagamentos(docm_id);
        Object key = pagamentoDAO.iniciarTransacao();

        try {
            for (Iterator iter = pagamentos.iterator(); iter.hasNext();) {
                DocumentoPagamentoVO documentoPagamentoVO =
                    (DocumentoPagamentoVO) iter.next();
                pagamentoDAO.apagarAgrupamentoPagamento(key,
                    documentoPagamentoVO.getDocm_id());

                Documento_pagamento documento_pagamento =
                    new Documento_pagamento();
                documento_pagamento.setDcpg_id(documentoPagamentoVO.getDocm_id());
                pagamentoDAO.apagarPagamento(key, documento_pagamento);
                BeanUtil.copiarVO(documentoPagamentoVO, documento_pagamento);
                auditoria.auditarRecurso(key, usuario, documento_pagamento,
                    Auditoria.EXCLUIR);

                Documento documento = new Documento();
                documento.setDocm_id(documentoPagamentoVO.getDocm_id());
                documentoDAO.apagarDocumento(key, documento);
                BeanUtil.copiarVO(documentoPagamentoVO, documento);
                auditoria.auditarRecurso(key, usuario, documento,
                    Auditoria.EXCLUIR);
            }

            ControleDocumento controleDocumento = new ControleDocumento();
            DocumentoFinanceiroVO documentoFinanceiroVO =
                new DocumentoFinanceiroVO();
            documentoFinanceiroVO.setDocm_id(docm_id);
            controleDocumento.removerDocumentoFinanceiro(key, usuario,
                documentoFinanceiroVO);
            pagamentoDAO.concluirTransacao(key);
        } catch (Exception e) {
            pagamentoDAO.abortarTransacao(key);
            throw e;
        }
    }
}
